#include <head.h> // 包含头文件

void *copy_data(void *arg); // 声明拷贝数据的函数

void *func_1(void *v) // 主线程执行的函数
{
    pthread_t Tid[5];             // 子线程标识符数组
    int arr[5] = {1, 2, 3, 4, 5}; // 定义一个整型数组用于存储数字

    for (size_t i = 0; i < 5; i++)
    {
        if (0 != pthread_create(&Tid[i], NULL, copy_data, NULL)) // 创建子线程，并执行copy_data函数
        {
            printf("pthread_creat error\n"); // 如果创建失败则输出错误信息
            return 0;                        // 返回0表示程序异常退出
        }
    }
    for (size_t i = 0; i < 5; i++)
    {
        pthread_join(Tid[i], NULL); // 等待子线程结束
    }
}

void *copy_data(void *arg) // 拷贝数据的函数
{
    FILE *src_file = fopen("1.txt", "r"); // 打开源文件以读取数据
    FILE *dst_file = fopen("2.txt", "a"); // 打开目标文件以追加数据

    if (src_file == NULL || dst_file == NULL)
    {
        printf("打开文件错误\n"); // 如果打开文件失败则输出错误信息
        exit(1);                  // 退出程序，返回值为1表示程序异常退出
    }

    char buffer[1024]; // 定义一个字符数组作为缓冲区，用于存放从源文件中读取的数据
    size_t bytes_read; // 定义一个变量用于保存实际读取到的字节数

    while ((bytes_read = fread(buffer, 1, sizeof(buffer), src_file)) > 0) // 循环读取源文件中的数据，每次最多读取sizeof(buffer)个字节，将读取到的数据存入buffer中，并将实际读取到的字节数赋值给bytes_read，如果读取到了文件末尾，则fread会返回0，循环结束。
    {
        fwrite(buffer, 1, bytes_read, dst_file); // 将读取到的数据写入目标文件中，每次写入bytes_read个字节。这样保证了每次写入的数据都是从源文件中读取到的数据。
    }

    fclose(src_file); // 关闭源文件
    fclose(dst_file); // 关闭目标文件

    return NULL; // 返回NULL表示该函数正常结束，无返回值需要传递。
}

int main(int argc, char const *argv[]) // main函数是程序的入口点，也是整个程序的开始执行的地方。它有两个参数：argc和argv。argc表示命令行参数的数量，argv是一个指向字符串数组的指针，该数组中存储了所有的命令行参数。这里我们不需要使用这两个参数，所以可以忽略它们。
{
    pthread_t Tid = 0;                                 // 定义一个线程标识符变量Tid，用于存储新创建的线程的标识符。初始值为0。
    if (0 != pthread_create(&Tid, NULL, func_1, NULL)) // 创建一个新的线程，并执行func_1函数。其中，&Tid用于接收新创建的线程的标识符，NULL表示使用默认的线程属性，func_1是要执行的函数，NULL表示传递给func_1函数的参数为NULL。如果创建线程成功，则pthread_create函数会返回0；否则，它会返回一个非零的错误码。这里我们通过判断pthread_create函数的返回值来确定是否创建线程成功。如果创建失败，则输出错误信息并返回0表示程序异常退出。
    {
        printf("pthread_creat error\n"); // 如果创建线程失败则输出错误信息
        return 0;                        // 返回0表示程序异常退出
    }
    pthread_join(Tid, NULL); // 等待新创建的线程结束。其中，Tid是要等待的线程标识符，NULL表示我们不关心新创建的线程结束时的返回值是什么。调用pthread_join函数后，main函数会暂停执行直到新创建的线程结束为止。然后，main函数会继续执行后面的代码。这里我们不需要关心新创建的线程结束时的返回值是什么，所以传入NULL即可。最后，main函数返回0表示程序正常结束。
